<?php

define("IT_DATE_STYLE", 1);
define("SQL_DATE_STYLE", 2);
define("US_DATE_STYLE", 3);

define("INSERT_OBJECT", 1);
define("DELETE_OBJECT", 2);
define("UPDATE_OBJECT", 3);

// check_permission (vedi tabella gruppi)
define("ADM_PERM", 1);
define("DOC_PERM", 2);
define("ATA_PERM", 4);
define("GEN_PERM", 8);
define("COO_PERM", 16);
define("SEG_PERM", 32);
define("DIR_PERM", 64);
define("DSG_PERM", 128);
define("STD_PERM", 256);
/*
 * raggruppa i permessi di accesso alle statistiche alunni
 */
define("STAT_STUD_PERM", 240);

/*
 * da disattivare in produzione
 * flag debug
 */
define("DISPLAY_ERRORS", 1);

/*
 * tipologie di finestra per check_session
 * 
 */
define("MAIN_WINDOW", 1);
define("POPUP_WINDOW", 2);
define("FAKE_WINDOW", 3);
define("AJAX_CALL", 4);


/*
 * array contenente i giorni, dall'inizio alla fine della scuola, in cui non è prevista lezione
 */
$holydays = array(	"2011-11-01",
					"2011-11-02",
					"2011-12-08", 
					"2011-12-23", 
					"2011-12-24", 
					"2011-12-25", 
					"2011-12-26", 
					"2011-12-27", 
					"2011-12-28", 
					"2011-12-29", 
					"2011-12-30", 
					"2011-12-31", 
					"2012-01-01", 
					"2012-01-02", 
					"2012-01-03", 
					"2012-01-04", 
					"2012-01-05", 
					"2012-01-06", 
					"2011-02-21",
					"2011-04-05",
					"2011-04-06",
					"2011-04-07", 
					"2011-04-08", 
					"2011-04-09", 
					"2011-04-10", 
					"2011-04-25",  
					"2011-04-28", 
					"2011-05-01", 
					"2011-06-02");


/**

        __debug

@Author:                Riccardo Bachis
@Copyright:             2003 Riccardo Bachis
@Created at:            Roma, 11 mar 2003
@Last Modified Time:    21 mar 2011

@DESC:      funzione di gestione errore: invia una mail all'amministratore con
            la descrizione dell'errore
@param:     $file - il file che ha generato l'errore
@param:     $linea - la riga di codice che ha generato l'errore
@param:     $errore - descrizione dell'errore generato
@param:     $descrizione - informazioni aggiuntive (messaggio d'errore di postgres)
@return:

*****************************************************************************************/

function __debug($file, $linea, $errore, $descrizione){
    $to = "";
    $subject = "Errore";
    $body = "Data: ".date("d/m/Y").", ore ".date("h:i:s")."\n\n";
    $body .= "Errore alla riga $linea nel file $file\n";
    $body .= "Descrizione errore: $descrizione";
    mail($to, $subject, $body);
    $log = fopen("", "a");
    fwrite($log, date("d/m/Y H:i:s")." - ".$_SERVER['REMOTE_ADDR']." - ".$file." - ".$linea."\n");
    fwrite($log, $errore." - ".$descrizione."\n\n");
    fclose($log);

}

/**

         linkedPages

@Author:                Riccardo Bachis
@Copyright:             2003 Riccardo Bachis
@Created at:            Roma, 16 apr 2003
@Last Modified Time:    19 ott 2007

@DESC:      paginatore: restituisce la pagina di partenza e quella
            di arrivo per i link del paginatore
@param:     $offset - variabile per calcolo della pagina
@param:     $record_per_page - numero di record per pagina
@param:     $pages - il numero di pagine totali
@return:    array - la pagina di partenza e quella finale in array

 *****************************************************************************************/
function linkedPages($offset, $record_per_page, $pages){
    if($offset == 0)
        $page = 1;
    else
        $page = ($offset / $record_per_page) + 1;
    if(($offset % $record_per_page) != 0)
    	$page++;
    if($pages < 11){
        return array(1, $pages);
    }
    else{
        $start = $end = 0;
        if($page < 6){
            $start = 1;
            $end = 10;
            $pagine = array(1, 10);
        }
        else{
            $max = $page + 5;
            $back_nmb = 4;
            $forw_nmb = 5;
            if($max > $pages){
                $diff = $max - $pages;
                $back_nmb += $diff;
            }
            $pagine = array($page - $back_nmb, $page + $forw_nmb);
        }
    }
    return $pagine;
}

/**

        check_mail

@Author:                Riccardo Bachis
@Copyright:             2003 Riccardo Bachis
@Created at:            Roma, 16 mar 2003
@Last Modified Time:    16 mar 2003

@DESC:      verifica la struttura formale di un indirizzo email
@param:     $mail - l'indirizzo da verificare
@return:    bolean

*****************************************************************************************/

function check_mail($mail){
    if(!preg_match("/.+@.+\..+/", $mail))
        return false;

    return true;

}


/**

        strtodb

@Author:                Riccardo Bachis
@Copyright:             2003 Riccardo Bachis
@Created at:            Roma, 13 mar 2003
@Last Modified Time:    13 mar 2003

@DESC:      funzione di formattazione di campi testo per inserimento in database
@param:     $stringa - la stringa da formattare
@return:    $str_rtn - la stringa formattata

*****************************************************************************************/

function strtodb($stringa){
    $str_rtn = trim($stringa);
    $str_rtn = preg_replace("/'/", "\'", $str_rtn);

    return $str_rtn;
}

/**

         field_null

@Author:                Riccardo Bachis
@Copyright:             2003-2007 Riccardo Bachis
@Created at:            Roma, 15 mar 2003
@Last Modified Time:    11 gen 2011

@DESC:      formatta i parametri delle stringhe sql settandoli a NULL se
            non presenti o aggiungendoci gli apici singoli se necessario
@param:     $var - il parametro da controllare
@param		$is_char - indica se il parametro e' di tipo stringa: nel caso, servono gli apici singoli
@return:    $res - la stringa convertita

*****************************************************************************************/

function field_null($var, $is_char){
    if($var == "")
        $res = "NULL";
    else{
        $res = $var;
        if($is_char)
        	$res = "'$res'";
    }
    return $res;
}

/**

         number_format

@Author:                Riccardo Bachis
@Copyright:             2003 Riccardo Bachis
@Created at:            Roma, 15 apr 2003
@Last Modified Time:    15 apr 2003

@DESC:      formatta i parametri numerici o stringhe portandoli ad un numero
            di caratteri passato come parametro, aggiungendo serie di caratteri
@param:     $val - il parametro da manipolare
@param:     $length - la lunghezza da raggiungere
@param:     $char - il carattere da usare come riempi posto
@return:    $res - la stringa modificata

*****************************************************************************************/

function nmb_format($val, $length, $char){
    if(strlen($val) < $length){
        $start = strlen($val) - 1;
        for($i = $srtart; $i < $length - 1; $i++)
            $val = $char.$val;
    }
    return $val;
}


/**

         format_date

@Author:                Riccardo Bachis
@Copyright:             2003 Riccardo Bachis
@Created at:            Roma, 15 mar 2003
@Last Modified Time:    15 mar 2003

@desc:      formatta le date
@param:     $data - la stringa da formattare
@param:     $or_style - stile della data da formattare (1=>g/m/a, 2=>a/m/g, 3=>m/g/a)
@param:     $style - stile di conversione (1=>g/m/a, 2=>a/m/g)
@param:     $separator - carattere separatore
@return:    $data_mod - la stringa convertita

*****************************************************************************************/

function format_date($data, $or_style, $style, $separator){
    //$ar = split("[/.-]", $data);
    if($or_style == IT_DATE_STYLE)
        list($day, $month, $year) = split("[/.-]", $data);
    else if($or_style == SQL_DATE_STYLE)
        list($year, $month, $day) = split("[/.-]", $data);
    else
        list($month, $day, $year) = split("[/.-]", $data);
	
	if(!checkdate($month, $day, $year))
    	return "";
	
    if($style == IT_DATE_STYLE)
        $data_mod = $day.$separator.$month.$separator.$year;
    else
        $data_mod = $year.$separator.$month.$separator.$day;

    return $data_mod;
}

function check_session($window = MAIN_WINDOW){
    if(!isset($_SESSION['__user__'])){
    	switch($window){
    		case POPUP_WINDOW:
    			print("<script type='text/javascript'>alert('Sessione scaduta: rifai il login'); window.opener.document.location.href = 'http://www.inrich.it/rclasse/index.php'; window.close();</script>");
    			break;
    		case FAKE_WINDOW:
    			print("<script type='text/javascript'>alert('Sessione scaduta: rifai il login'); window.parent.document.location.href = 'http://www.inrich.it/rclasse/index.php';</script>");
    			break;
    			break;
    		case AJAX_CALL:
    		case MAIN_WINDOW:
    		default:
    			header("Location: http://www.inrich.it/rclasse/index.php");
    			break;
    	}
        exit;
    }
}

function check_permission($admitted){
	if($_SESSION['__user__']->check_perms($admitted) == false){
		// registro in sessione la pagina chiamante
		$_SESSION['__referer__'] = $_SERVER['HTTP_REFERER'];
		header("Location: http://www.inrich.it/shared/no_permission.php");
	}

}

function get_login($names, $nome, $cognome){
	// analizzo il nome: se composto, utiizzo solo il primo
	if(preg_match("/ /", $nome)){
		$nomi = split(" ", $nome);
	}
	else $nomi[0] = $nome;
	// elimino eventuali accenti (apostrofi) e spazi (solo dal cognome)
	$nm = strtolower(ereg_replace("'", "", $nomi[0]));
	$cm = strtolower(ereg_replace("'", "", trim($cognome)));
	// creo la login e verifico
	$login = $nm.".".$cm;
	// $ok = false - login non valida
	$ok = false; 
	// valore numerico per la creazione di login univoche
	$index = 1;
	while(!$ok){
		if(!in_array($login, $names)){
			return $login;
		}
		else{
			$login .= $index;
			$index++;
		}
	}
}

function get_password($str1, $str2, &$pwd_chiaro){
	$pwd_chiaro = substr(strrev($str1), 0, 4).rand(0, 9).rand(0, 9).substr(strrev($str1), 0, 2);
	return md5(substr(strrev($str1), 0, 4).rand(0, 9).rand(0, 9).substr(strrev($str1), 0, 2));
}

function text2html($html){
    if($html == "")
    	return $html;
    $html = preg_replace("/\n/", "<br />", $html);
    //$html = preg_replace("/<br>/", "\n", $html);
    return $html;
}

function time_to_sec($time) {
    list($hours, $minutes, $seconds) = explode(":", $time);

    return $hours * 3600 + $minutes * 60 + $seconds;
} 

/**

         array_index

@Author:                Riccardo Bachis
@Copyright:             2010 Riccardo Bachis
@Created at:            Siliqua, 19 dic 2010
@Last Modified Time:    19 dic 2010

@desc:      cerca $val in $array e ne restituisce l'indice se presente, altrimenti -1 
@param:     $array - l'array da esaminare
@param:     $val - l'elemento da ricercare
@return:    $index - l'indice dell'elemento, se trovato, altrimenti -1

*****************************************************************************************/
function array_index($array, $val){
	for($i = 0; $i < count($array); $i++){
		if($array[$i] == $val)
			return $i;
	}
	return -1;
}


/**

        minutes2hours

@Author:                Riccardo Bachis
@Copyright:             2011 Riccardo Bachis
@Created at:            Siliqua, 14 gen 2011
@Last Modified Time:    14 gen 2011

@DESC:      restituisce il tempo ricevuto in minuti nel formato hh:mm
@param:     $time_from - il tempo da formattare
@param:     $zero_string - la stringa da restituire se il tempo = 0
@return:	string: tempo formattato

*****************************************************************************************/

function minutes2hours($time_from, $zero_string){
	$fmt_time = $time_from%60;
	$x = $time_from - $fmt_time;
	$x /= 60;
	if($x < 10)
		$x = "0".$x;
	if($fmt_time < 10)
		$fmt_time = "0".$fmt_time;
	$fmt_time = $x.":".$fmt_time;
	if($fmt_time == "00:00")
		return $zero_string;
	return $fmt_time;
}

/*****************************************************************************************

        truncateString

@Author:                Riccardo Bachis
@Copyright:             2011 Riccardo Bachis
@Created at:            Siliqua, 31 mag 2011
@Last Modified Time:    31 mag 2011
@source:				http://www.senamion.it/2006/05/30/c-troncare-una-stringa-senza-tagliare-una-parola/

@DESC:      restituisce una stringa troncandola ad un numero max di caratteri, aggiungendo se necessario dei caratteri di "continua"
@param:     $txt - la stringa da formattare
@param:     il numero max di caratteri
@return:	string: la stringa formattata

*****************************************************************************************/
function truncateString($txt, $chars=50) { 
	if (strlen($txt) <= $chars) 
		return $txt; 
	$new = wordwrap($txt, $chars, "|"); 
	$new_text = explode("|",$new); 
	return $new_text[0]." [...]"; 
} 